package com.example.factory.persistence;

import android.content.Context;
import android.content.SharedPreferences;
import android.text.TextUtils;

import com.example.factory.Factory;
import com.example.factory.model.api.account.AccountRspModel;
import com.example.factory.model.db.User;
import com.example.factory.model.db.User_Table;
import com.raizlabs.android.dbflow.sql.language.SQLite;

/**
 * @author:0.2℃
 * @date： 2022-01-03 13:51
 * @version:
 * @Description ：这个类用来获取用户的账户信息，并存储起来
 */
public class Account {
    // 使用一个序列化把它存储起来
    private static final String KEY_PUSH_ID = "KEY_PUSH_ID";
    private static final String KEY_IS_BIND = "KEY_IS_BIND";
    private static final String KEY_TOKEN = "KEY_TOKEN";
    private static final String KEY_USERID = "KEY_USERID";
    private static final String KEY_ACCOUNT = "KEY_ACCOUNT";

    // 推送的设备id
    private static String pushId;
    // 设备是否已经绑定了服务器
    private static boolean isBind;
    // 登录状态的token，用来接口请求
    private static String token;
    // 登陆的额用户id
    private static String userId;
    // 登录的用户账户缓存
    private static String account;

    /**
     * 存储数据到XML文件当中，持久化
     */
    private static void save(Context mContext){
        // 获取数据持久化的sp
        SharedPreferences sp = mContext.getSharedPreferences(Account.class.getName(),
                Context.MODE_PRIVATE);
        // 存储数据，apply是异步的，commit是同步的
        sp.edit()
                .putString(KEY_PUSH_ID, pushId)
                .putBoolean(KEY_IS_BIND, isBind)
                .putString(KEY_TOKEN, token)
                .putString(KEY_USERID, userId)
                .putString(KEY_ACCOUNT, account)
                .apply();
    }

    /**
     * 进行数据加载，在app刚初始化的时候调用，即在Factory使用，在App中进行初始化
     * @param mContext
     */
    public static void load(Context mContext) {
        SharedPreferences sp = mContext.getSharedPreferences(Account.class.getName(),
                Context.MODE_PRIVATE);
        pushId = sp.getString(KEY_PUSH_ID, "");
        isBind = sp.getBoolean(KEY_IS_BIND, false);
        token = sp.getString(KEY_TOKEN, "");
        userId = sp.getString(KEY_USERID, "");
        account = sp.getString(KEY_ACCOUNT, "");

    }

    /**
     * 设置并存储设备的推送id
     * @param pushId
     */
    public static void setPushId(String pushId) {
        Account.pushId = pushId;
        Account.save(Factory.app());
    }

    /**
     * 获取推送id
     * @return
     */
    public static String getPushId() {
        return pushId;
    }

    /**
     * 返回当前账号是否登录
     * @return
     */
    public static boolean isLogin() {
        // 用户id和token不为空
        return !TextUtils.isEmpty(userId)
                && !TextUtils.isEmpty(token);
    }

    /**
     * 是否已经完善了用户信息
     * @return true 已经完善
     */
    public static boolean isComplete() {
        // 首先保证登录成功
        if (isLogin()) {
            User self = getUser();
            return !(TextUtils.isEmpty(self.getDesc())
                    && TextUtils.isEmpty(self.getPortrait())
                    && self.getSex() == 0);
        }
        // 未登录，返回信息不完全
        return false;
    }

    /**
     * 是否已经绑定了服务器
     * @return
     */
    public static boolean isBind() {
        return isBind;
    }

    /**
     * 设置绑定状态
     * @param isBInd
     */
    public static void setBind(boolean isBInd) {
        Account.isBind = isBInd;
        Account.save(Factory.app());
    }

    /**
     * 保存我们自己的信息到持久化XML当中
     * @param model
     */
    public static void login(AccountRspModel model) {
        // 存储当前登陆的token，
        Account.token = model.getToken();
        Account.account = model.getAccount();
        Account.userId = model.getUser().getId();
        save(Factory.app());

    }

    /**
     * 获取当前登录的用户信息
     * @return
     */
    public static User getUser() {
        // 如果为null，则返回一个new的user，不然就去数据库查询
        return TextUtils.isEmpty(userId) ? new User() : SQLite.select()
                .from(User.class)
                .where(User_Table.id.eq(userId))
                .querySingle();
    }

    /**
     * 获取当前登录的token
     * @return
     */
    public static String getToken() {
        return token;
    }
}
